package com.ripservice.mapper;

import com.ripservice.entity.LinkEntity;
import com.ripservice.entity.RouterEntity;
import com.ripservice.entity.TopologyEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface TopologyMapper {

    // Topology
    
    /**
     * 查询所有拓扑结构
     * @return 拓扑结构列表
     */
    List<TopologyEntity> findAllTopologies();


    /**
     * 更新拓扑结构信息
     * @param entity 拓扑结构实体
     */
    void update(TopologyEntity entity);

    /**
     * 根据ID删除拓扑结构
     * @param id 拓扑结构ID
     */
    void delete(@Param("id") Long id);


    /**
     * 根据ID查询拓扑结构
     * @param id 拓扑结构ID
     * @return 拓扑结构实体
     */
    TopologyEntity findById(@Param("id") Long id);

    /**
     * 插入新的拓扑结构
     * @param entity 拓扑结构实体
     */
    void insert(TopologyEntity entity);

    // Routers
    
    /**
     * 根据拓扑结构ID查询所有路由器
     * @param topologyId 拓扑结构ID
     * @return 路由器列表
     */
    List<RouterEntity> findRoutersByTopology(@Param("topologyId") Long topologyId);

    /**
     * 插入新的路由器
     * @param r 路由器实体
     */
    void insertRouter(RouterEntity r);

    /**
     * 根据拓扑结构ID和路由器ID查询路由器
     * @param topologyId 拓扑结构ID
     * @param routerId 路由器ID
     * @return 路由器实体
     */
    RouterEntity findRouter(@Param("topologyId") Long topologyId, @Param("routerId") String routerId);

    /**
     * 根据拓扑结构ID和路由器ID更新路由器信息
     * @param r 路由器实体
     */
    void updateRouter(RouterEntity r);

    /**
     * 根据拓扑结构ID删除所有路由器
     * @param topologyId 拓扑结构ID
     */
    void deleteRouters(@Param("topologyId") Long topologyId);
    
    // Links
    
    /**
     * 根据拓扑结构ID查询所有链路
     * @param topologyId 拓扑结构ID
     * @return 链路列表
     */
    List<LinkEntity> findLinksByTopology(@Param("topologyId") Long topologyId);

    /**
     * 插入新的链路
     * @param l 链路实体
     */
    void insertLink(LinkEntity l);

    /**
     * 根据拓扑结构ID删除所有链路
     * @param topologyId 拓扑结构ID
     */
    void deleteLinks(@Param("topologyId") Long topologyId);

    /**
     * 根据拓扑结构ID和链路ID更新链路
     * @param l 链路实体
     */
    void updateLink(LinkEntity l);

}